home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / alloc_v2 / dosalloc.asm next >
Assembly Source File  |  1987-06-16  |  2KB  |  78 lines

  1. name dosalloc
  2.  
  3. public dosalloc_
  4.  
  5. ;------------------------------------------------------------------------------
  6. ; (c) Copyright 1984,1985,1986,1987 Front Line Software. All Rights Reserved.
  7. ;
  8. ;                DOSALLOC.ASM
  9. ;
  10. ;                 RELEASE 2.0
  11. ;
  12. ;    'C' routine to allocate paragraphs of memory (MSDOS function 48)
  13. ;
  14. ;          LARGE MODEL VERSION
  15. ;    (routine will execute a FAR return).
  16. ;
  17. ;    Written:   12/31/84
  18. ;    Updated:   07/16/87
  19. ;
  20. ;    This function is called by SALLOC() and SFREE(). It is not designed
  21. ;    to be a stand alone program.
  22. ;
  23. ;------------------------------------------------------------------------------
  24. ;
  25. cgroup group code
  26. dgroup group data,const,stack
  27. assume cs:cgroup, ds:dgroup, es:dgroup, ss:dgroup
  28. stack segment stack 'stack'
  29. stack ends
  30. data segment 'data'
  31. data ends
  32. const segment 'const'
  33. const ends
  34. code segment 'code'
  35. dosalloc_    proc    far    ; Entry conforms to 'Mark Williams 'C''
  36.  
  37.         push    si    ; Change these three register saves to
  38.         push    di    ; port to a different compiler. Also
  39.         push    bp    ; change two lines down [bp + 10]. For
  40.                 ; every register you add, add two more
  41.                 ; to BP (as [bp + 12]). For every one
  42.                 ; you subtract, subtract 2 (as [bp + 8]).
  43.                 ; Don't forget the exit code at the end
  44.                 ; of this file.
  45.  
  46.         mov    bp,sp
  47.         mov    ax,[bp + 10];    ; load # of bytes
  48.  
  49.         test    ax,3fffH    ; is the request for zero ?
  50.         jz    no_go        ; then don't divide !
  51.         mov    dx,0000H    ; clear upper word for division
  52.         mov    cx,0010H    ; 16 decimal
  53.         div    cx        ; convert bytes to paragraphs
  54.         mov    bx,ax        ; put results into bx
  55.         mov    ax,dx
  56.         test    ax,3fffH    ; was there a remainder ?
  57.         jz    get_blk     ; no, go get the memory
  58.         add    bx,0001H    ; yes, round the paragraphs up
  59. get_blk:    mov    ah,48H        ; DOS function 48
  60.         int    0021H        ;
  61.         jnb    seta        ; jump if no error retruned
  62. no_go:        mov    ax,0000H    ; else return NULL
  63.  
  64. seta:        mov    dx,ax        ; segment in dx
  65.         mov    ax,0000H    ; offset in ax
  66.  
  67.  
  68.         mov    sp,bp    ;Exit conforms to 'Mark Williams 'C''
  69.  
  70.         pop    bp    ; Here are the three registers to change
  71.         pop    di    ; if you are porting. Remember, they get
  72.         pop    si    ; Pop'ed in the reverse order of which
  73.         ret        ; they get Push'ed.
  74. dosalloc_    endp
  75. code    ends
  76. end
  77.  
  78.